package com.tony.inet;

import com.sun.org.apache.bcel.internal.generic.NEW;
import sun.security.x509.IPAddressName;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @version V1.0  </br>
 * @ClassName DownImage </br>
 * @Description TODO  </br>
 * @Author tonywang</br>
 * @DATE 2/28/2019 1:50 PM</br>
 */
public class DownImage {
    public static void main(String[] args){
        String imgUrl = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1551333100&di=e9082c0b9d7590470d7c67b739b9da66&src=http://i4.hexunimg.cn/2016-10-11/186368488.jpg";
        String fileName = "D:/test.jpg";
        try {
            writeToDesk(imgUrl,fileName);
        }catch (IOException pE) {
            pE.printStackTrace();
        }
    }

    public static void writeToDesk(String imgUrl,String fileName) throws IOException {
        FileOutputStream fp = null;
        byte[] imgByte = getNetImageBytes(imgUrl);
        File file = new File(fileName);
        fp = new FileOutputStream(file);
        System.out.println("图片已保存. 文件地址: " + file.getAbsolutePath());
        fp.write(imgByte);
        fp.flush();
        fp.close();

    }

    public static byte[] getNetImageBytes(String imgUrl) throws IOException {
        // 将字符串path封装成URL对象
        URL url = new URL(imgUrl);
        // 获取基于HTTP协议的链接对象
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");// 设置请求方式
        connection.setConnectTimeout(5*1000);// 设置请求超时时间5s
        if (connection.getResponseCode() == 200) {// 200-299 用于表示请求成功
            InputStream inputStream = connection.getInputStream();//通过输入流获取图片数据
            //得到图片的二进制数据
            byte[] imgByte = readByteFromInputStream(inputStream);
            return  imgByte;
        }
        return null;
    }

    //读取输入流中的数据,可以抽象出一个Stream工具类
    public static byte[] readByteFromInputStream(InputStream pInputStream) throws IOException {
        /*
		 * ByteArrayOutputStream: 此类实现了一个输出流，其中的数据被写入一个 byte
		 * 数组。缓冲区会随着数据的不断写入而自动增长。 可使用 toByteArray()和 toString()获取数据。
		 * ByteArrayOutputStream 是用来缓存数据的，向它的内部缓冲区写入数据，缓冲区自动增长,
		 * 当写入完成时可以从中提取数据。由于这个原因，ByteArrayOutputStream常用于存储数据以用于一次写入。
		 */
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        while ( (len = pInputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, len);
        }
        byte[]  resultBytes = outputStream.toByteArray();
        pInputStream.close();
        outputStream.close();
        return resultBytes;
    }
}
